#include <iostream>

using namespace std;
// 1381.设计一个支持增量操作的栈
// 实现自定义栈类 CustomStack ：
// CustomStack(int maxSize)：用 maxSize 初始化对象，maxSize 是栈中最多能容纳的元素数量。
// void push(int x)：如果栈还未增长到 maxSize ，就将 x 添加到栈顶。
// int pop()：弹出栈顶元素，并返回栈顶的值，或栈为空时返回 -1 。
// void inc(int k, int val)：栈底的 k 个元素的值都增加 val 。如果栈中元素总数小于 k ，则栈中的所有元素都增加 val 。

class CustomStack {
public:
    CustomStack(int maxSize) {
        data = new int[maxSize];
        capacity = maxSize;
        top = -1;
    }

    ~CustomStack() {
        delete []data;
    }
    //x进栈
    void push(int x) {
        if(top + 1 < capacity) {    // 没有出现上溢出
            top++;
            data[top] = x;
        }
    }

    int pop() {
        if(top == -1)
            return -1;
        else {
            int e = data[top];
            top--;
            return e;
        }
    }
    // 栈底的 k 个元素的值都增加 val
    void increment(int k, int val) {
        int m = top + 1 <= k ? top + 1 : k;
        for(int i = 0; i < m; i++)
            data[i] += val;
    }

private:
    int *data;  // 存放栈元素的动态数组
    int capacity;   // data数组的容量
    int top;    // 栈顶指针
};

void printStack(CustomStack *stack) {
    cout << "Stack: [ ";
}

int main() {
    CustomStack *stk = new CustomStack(3);  // 栈是空的 []
    stk->push(1);           // 栈变为 [1]
    stk->push(2);           // 栈变为 [1, 2]
    cout<<stk->pop()<<endl;     // 返回 2 --> 返回栈顶值 2，栈变为 [1]
    stk->push(2);           // 栈变为 [1, 2]
    stk->push(3);            // 栈变为 [1, 2, 3]
    stk->push(4);               // 栈仍然是 [1, 2, 3]，不能添加其他元素使栈大小变为 4
    stk->increment(5, 100);     // 栈变为 [101, 102, 103]
    stk->increment(2, 100);     // 栈变为 [201, 202, 103]
    cout<<stk->pop()<<endl; // 返回 103 --> 返回栈顶值 103，栈变为 [201, 202]
    cout<<stk->pop()<<endl; // 返回 202 --> 返回栈顶值 202，栈变为 [201]
    cout<<stk->pop()<<endl; // 返回 201 --> 返回栈顶值 201，栈变为 []
    cout<<stk->pop()<<endl; // 返回 -1 --> 栈为空，返回 -1
    return 0;
}
